package com.itheima.edu.info.manager.dao;

import com.itheima.edu.info.manager.domain.Student;

/*
专门负责处理数据
接收业务员传过来的有误逻辑
将数据拿到系统数据仓库中进行增删改查
将处理的结果给到业务员
 */
//1. 定义一个系统数据仓库:数组实现
//库管类
public class StudentDao implements BaseStudentDao {
    //定义一个数组容器
    private static Student[] stus = new Student[5];

    //静态代码块:随着类的加载而加载,自动执行!
    //作用:一般都会用来做一些数据的初始化,系统配置的加载!
    static{
        System.out.println("========加载中=========");
        Student stu1 = new Student("heima001","柳岩","36","1999-11-11");
        Student stu2 = new Student("heima002","杨幂","35","1995-11-11");
        stus[0]=stu1;
        stus[1]=stu2;
    }

    //库管类中的添加学生功能
    public boolean addStudent(Student stu) {

        //2. 通过标记位思想来确定本次要添加的学生对象对应存入的位置
        //先假设数组已经存满了
        int index = -1;
        //遍历数组
        for (int i = 0; i < stus.length; i++) {
            //获取每一个索引位置的元素
            //只要当前索引位置的元素为null,说明这个位置还空着还可以存数据
            if (stus[i] == null) {
                //将当前索引位置记录到index
                index = i;
                break;
            }
        }
        //3. 根据index的值来决定本次添加的结果
        if (index == -1) {
            //存满了,则本次无法添加了,返回false,表示添加失败
            return false;
        } else {
            //不是-1,说明数组容器还没有存满,还有位置可以存
            //(1) 将本次要添加的学生对象存入数组
            stus[index] = stu;
            //(2) 返回true 表示添加学生
            return true;
        }
    }

    //库管类中的学生查询功能
    public Student[] findALLStudent() {
        return stus;
    }

    //库管类中的删除学生功能
    public boolean deleteStudent(String deleteId) {
        //1. 找到本次要删除的学号所对象的学生对象在数组中所对应的索引位置
        //2. 先假设要删除的学号不存在
        int index = getIdext(deleteId);
        if (index == -1) {
            //说明传过来的学号在系统里不存在,直接返回false,表示删除失败
            return false;
        } else {
            //不是-1说明传过来的学号在系统中存在,这时候将该索引位置 置为null,模拟删除
            //2. 拿新的学生对象去替换改索引位置原本的老对象,从而达到修改的目的
            stus[index] = null;
            return true;
        }
    }

    //库管类中的修改学生功能
    public boolean updateStudent(String updateId, Student newStu) {
       int index = getIdext(updateId);
        //根据index的值来决定是否删除成功
        if (index == -1) {
            //说明传过来的学号在系统里不存在,直接返回false,表示删除失败
            return false;
        } else {
            //不是-1说明传过来的学号在系统中存在,这时候将该索引位置 置为null,模拟删除
            //2. 拿新的学生对象去替换改索引位置原本的老对象,从而达到修改的目的
            stus[index] = newStu;
            return true;
        }
    }

    public int getIdext(String id){
        //1. 根据要修改的学号找到对应的学生在数组中的索引位置
        //2. 先假设要删除的学号不存在
        int index = -1;
        //遍历数组
        for (int i = 0; i < stus.length; i++) {
            Student stu = stus[i];
            //当前索引元素位置不为null并且该元素和要删除的学号一致时,修改标记
            if (stu != null && stu.getId().equals(id)) {
                //修改标记,记录当前学生对象的索引
                index = i;
                break;
            }
        }
        return index;
    }
}
